package cn.mandifal.seller.service.impl;

import cn.mandifal.mapper.*;
import cn.mandifal.pojo.*;
import cn.mandifal.seller.service.GoodsManagementService;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import entity.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * 商家商品管理服务的实现层
 * @author
 */
@Service
@Transactional
public class GoodsManagementServiceImpl implements GoodsManagementService {

    @Autowired
    private DpGoodsMapper dpGoodsMapper;
    @Autowired
    private DpGoodsDescMapper dpGoodsDescMapper;
    @Autowired
    private DpItemMapper dpItemMapper;
    @Autowired
    private DpItemCatMapper dpItemCatMapper;
    @Autowired
    private DpBrandMapper dpBrandMapper;
    @Autowired
    private  DpSellerMapper dpSellerMapper;

    /**
     * 查询所有
     * @return 返回结果
     */
    @Override
    public List<DpGoods> findAll() {
        return dpGoodsMapper.selectByExample(null);
    }

    /**
     * 更新商品状态
     * @param ids 商品 id
     * @param status 状态
     */
    @Override
    public void updateAuditState(Long[] ids,String status) {
        for (Long id:ids) {
            DpGoods dpGoods = dpGoodsMapper.selectByPrimaryKey(id);
            dpGoods.setAuditStatus(status);
            dpGoodsMapper.updateByPrimaryKey(dpGoods);
        }

    }


    /**
     * 模糊查询，无条件时查询所有
     * @param pageNum 页码
     * @param pageSize 页面大小
     * @param dpGoods 商品 spu 实体
     * @return 返回分页结果
     */
    @Override
    public PageResult search(int pageNum, int pageSize, DpGoods dpGoods) {
        PageHelper.startPage(pageNum,pageSize);
        DpGoodsExample dpGoodsExample= new DpGoodsExample();
        DpGoodsExample.Criteria criteria = dpGoodsExample.createCriteria();
        if (dpGoods!=null){
            //只查询本用户的商品
            if (dpGoods.getSellerId()!=null && dpGoods.getSellerId().length()>0){
                criteria.andSellerIdEqualTo(dpGoods.getSellerId());
                criteria.andIsDeleteIsNull();
            }
            //判断商品状态
            if(dpGoods.getAuditStatus() !=null && dpGoods.getAuditStatus().length()>0){
                criteria.andAuditStatusEqualTo(dpGoods.getAuditStatus());
            }
            //判断商品名字
            if (dpGoods.getGoodsName() !=null && dpGoods.getGoodsName().length()>0){
                criteria.andGoodsNameLike("%"+dpGoods.getGoodsName()+"%");
            }
        }
        Page<DpGoods>page= (Page<DpGoods>) dpGoodsMapper.selectByExample(dpGoodsExample);
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 添加商品 spu 和详情
     * @param goodsCombine 商品组合实体
     */
    @Override
    public void add(GoodsCombine goodsCombine) {
        //设置时间
        goodsCombine.getDpGoods().setCreateTime(new Date());
        //设置状态为未申请
        goodsCombine.getDpGoods().setAuditStatus("0");
        //设置是否上架为初始状态，
        goodsCombine.getDpGoods().setIsMarketable("0");
        dpGoodsMapper.insert(goodsCombine.getDpGoods());
        //设置商品详情表的主键 spu 的 id
        goodsCombine.getDpGoodsDesc().setGoodsId(goodsCombine.getDpGoods().getId());
        dpGoodsDescMapper.insert(goodsCombine.getDpGoodsDesc());
        // 保存商品 sku 信息
        saveItemList(goodsCombine);

    }

    /**
     *  抽取成方法，来保存商品 sku 信息
     * @param goodsCombine 组合实体 bean
     */
    private void saveItemList(GoodsCombine goodsCombine){
        //遍历商品组合类中的商品 sku 列表
        for (DpItem dpItem:goodsCombine.getDpItemList()) {
            //设置标题 spu+规格选项值
            String goodsName = goodsCombine.getDpGoods().getGoodsName();
            //转换规格选项值
            Map<String,Object> map = JSON.parseObject(dpItem.getSpec());
            //遍历转换后的集合
            for (String key:map.keySet()) {
                goodsName+=" "+map.get(key);
            }
            dpItem.setTitle(goodsName);
            //设置商品 spuid
            dpItem.setGoodsId(goodsCombine.getDpGoods().getId());
            //设置商家 id
            dpItem.setSellerId(goodsCombine.getDpGoods().getSellerId());
            //设置商家名称
            DpSeller dpSeller = dpSellerMapper.selectByPrimaryKey(goodsCombine.getDpGoods().getSellerId());
            dpItem.setSeller(dpSeller.getNickName());
            //设置商品3级分类id
            dpItem.setCategoryid(goodsCombine.getDpGoods().getCategory3Id());
            //设置分类名称
            DpItemCat dpItemCat = dpItemCatMapper.selectByPrimaryKey(goodsCombine.getDpGoods().getCategory3Id());
            dpItem.setCategory(dpItemCat.getName());
            //设置商品品牌
            DpBrand dpBrand = dpBrandMapper.selectByPrimaryKey(goodsCombine.getDpGoods().getBrandId());
            //设置图片，只保存第一个
            //转换成 map 类型的列表
            List<Map> imageList=JSON.parseArray(goodsCombine.getDpGoodsDesc().getItemImages(),Map.class);
            if (imageList.size()>0){
                //如果存在，则保存第一个图片的 url
                dpItem.setImage((String) imageList.get(0).get("url"));
            }
            dpItem.setBrand(dpBrand.getName());
            //设置修改日期创建日期
            dpItem.setCreateTime(new Date());
            dpItem.setUpdateTime(new Date());
            dpItemMapper.insert(dpItem);
        }
    }

    /**
     * 查询一个商品信息
     * @param id 商品 id
     * @return 返回查询结果
     */
    @Override
    public GoodsCombine findOne(Long id) {
        GoodsCombine goodsCombine = new GoodsCombine();
        //设置商品 spu
        goodsCombine.setDpGoods(dpGoodsMapper.selectByPrimaryKey(id));
        //设置商品详情
        goodsCombine.setDpGoodsDesc(dpGoodsDescMapper.selectByPrimaryKey(id));
        //查询当前 spu 对应的 sku
        DpItemExample dpItemExample=new DpItemExample();
        DpItemExample.Criteria criteria = dpItemExample.createCriteria();
        criteria.andGoodsIdEqualTo(id);
        goodsCombine.setDpItemList(dpItemMapper.selectByExample(dpItemExample));
        return goodsCombine;
    }

    /**
     * 更新商品信息
     * @param goodsCombine 商品组合实体
     */
    @Override
    public void update(GoodsCombine goodsCombine) {
        //更新 spu 表
        goodsCombine.getDpGoods().setUpdateTime(new Date());
        dpGoodsMapper.updateByPrimaryKey(goodsCombine.getDpGoods());
        //更新 spu 详情表
        dpGoodsDescMapper.updateByPrimaryKeySelective(goodsCombine.getDpGoodsDesc());
        //目前采取先删除在插入的策略
        DpItemExample dpItemExample=new DpItemExample();
        DpItemExample.Criteria criteria = dpItemExample.createCriteria();
        criteria.andGoodsIdEqualTo(goodsCombine.getDpGoods().getId());
        dpItemMapper.deleteByExample(dpItemExample);
        //重新插入 sku 信息
        saveItemList(goodsCombine);


    }

    /**
     * 自动下架并删除
     * @param ids 待删除商品 id
     */
    @Override
    public void delete(Long[] ids) {
        for (Long id:ids) {
            DpGoods dpGoods = dpGoodsMapper.selectByPrimaryKey(id);
            //如果商品通过审核设置下架状态
            if ("2".equals(dpGoods.getAuditStatus())){
                //2代表下架
                dpGoods.setIsMarketable("2");
            }
            //1代表删除
            dpGoods.setIsDelete("1");
            dpGoodsMapper.updateByPrimaryKey(dpGoods);
            //逻辑删除此 spu 下的所有 sku
            DpItemExample dpItemExample=new DpItemExample();
            DpItemExample.Criteria criteria = dpItemExample.createCriteria();
            criteria.andGoodsIdEqualTo(id);
            //得到此 spu 下的所有 sku
            List<DpItem> dpItems = dpItemMapper.selectByExample(dpItemExample);
            for (DpItem dpItem:dpItems) {
                //3为删除状态
                dpItem.setStatus("3");
                dpItemMapper.updateByPrimaryKey(dpItem);
            }
        }

    }

    /**
     * 上架商品
     * @param ids 待上架的商品 id
     */
    @Override
    public void putAway(Long[] ids) {
        for (Long id:ids) {
            DpGoods dpGoods = dpGoodsMapper.selectByPrimaryKey(id);
            dpGoods.setIsMarketable("1");
            dpGoodsMapper.updateByPrimaryKey(dpGoods);
            //得到 sku，并上架所有的 sku
            DpItemExample dpItemExample=new DpItemExample();
            DpItemExample.Criteria criteria = dpItemExample.createCriteria();
            criteria.andGoodsIdEqualTo(id);
            List<DpItem> dpItems = dpItemMapper.selectByExample(dpItemExample);
            //遍历sku列表，并设置所有的 sku 为上架状态
            for (DpItem dpitem:dpItems) {
                dpitem.setStatus("1");
                dpItemMapper.updateByPrimaryKey(dpitem);
            }
        }
    }

    /**
     * 下架商品
     * @param ids 待下架的商品 id
     */
    @Override
    public void soldOut(Long[] ids) {
        for (Long id : ids) {
            DpGoods dpGoods = dpGoodsMapper.selectByPrimaryKey(id);
            dpGoods.setIsMarketable("2");
            dpGoodsMapper.updateByPrimaryKey(dpGoods);
            //得到 sku，并下架所有的 sku
            DpItemExample dpItemExample = new DpItemExample();
            DpItemExample.Criteria criteria = dpItemExample.createCriteria();
            criteria.andGoodsIdEqualTo(id);
            List<DpItem> dpItems = dpItemMapper.selectByExample(dpItemExample);
            //遍历sku列表，并设置所有的 sku 为下架状态
            for (DpItem dpitem : dpItems) {
                dpitem.setStatus("0");
                dpItemMapper.updateByPrimaryKey(dpitem);
            }
        }
    }
    /**
     * 查询，通过 spuid 和装填
     * @param goodsIds spu id
     * @param status 装填
     * @return 返回查到的列表
     */
    @Override
    public List<DpItem> findItemListByGoodsIdAndStatus(Long[] goodsIds, String status) {
        DpItemExample example=new DpItemExample();
        DpItemExample.Criteria criteria = example.createCriteria();
        //相当于 sql 语句中的 in，组查询
        criteria.andGoodsIdIn(Arrays.asList(goodsIds));
        criteria.andStatusEqualTo(status);
        List<DpItem> dpItems = dpItemMapper.selectByExample(example);
        System.out.println("查到的商品 sku 为："+dpItems+"状态为："+status);
        return dpItems;
    }
}
